#include "bsp_delay.h"

/**
 * @brief  初始化定时器
 * @retval None
 */
void bsp_Delay_Init(void)
{
    RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;           // 总线时钟使能

    TIM5->SMCR &= ~(TIM_SMCR_SMS | TIM_SMCR_ECE); // 使用内部时钟
    TIM5->PSC = 0;                                // 时钟频率100M，不分频
    TIM5->CR1 &= ~TIM_CR1_DIR;                    // 向上计数
    TIM5->CR1 &= ~TIM_CR1_CKD;                    // 内部不分频
    TIM5->SR &= ~TIM_SR_UIF;                      // 清除Update中断标志位
}

/**
 * @brief  毫秒级阻塞延时
 * @param  cnt : 延时ms数
 * @retval None
 */
void Delay_ms(uint32_t cnt)
{
    TIM5->ARR = 100000;                    // 1ms时基
    TIM5->CR1 |= TIM_CR1_CEN;              // 使能计数器
    for (uint32_t i = 0; i < cnt; i++) {
        while (!(TIM5->SR & TIM_SR_UIF)) { // 等待update事件
        }
        TIM5->SR &= ~TIM_SR_UIF;           // 清除更新标志位
    }
    TIM5->CR1 &= ~TIM_CR1_CEN;             // 关闭计数器
}

/**
 * @brief  微秒级阻塞延时
 * @param  cnt : 延时us数
 * @retval None
 */
void Delay_us(uint32_t cnt)
{
    TIM5->ARR = 100;                       // 1us时基
    TIM5->CR1 |= TIM_CR1_CEN;              // 使能计数器
    for (uint32_t i = 0; i < cnt; i++) {
        while (!(TIM5->SR & TIM_SR_UIF)) { // 等待update事件
        }
        TIM5->SR &= ~TIM_SR_UIF;           // 清除更新标志位
    }
    TIM5->CR1 &= ~TIM_CR1_CEN;             // 关闭计数器
}
